//
//  ViewController.m
//  27---Bloack
//
//  Created by 冀永金 on 16/8/19.
//  Copyright © 2016年 冀永金. All rights reserved.
//

#import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()
// 写在属性中
@property (weak, nonatomic) IBOutlet UILabel *textLabel;
@property (nonatomic,copy) void (^block)();
// 写在方法中
- (void)handeleData:(void(^)())handleData;
@end

@implementation ViewController
- (void)handeleData:(void (^)())handleData {
    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        handleData();
        
    }];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //  1.Block  是啥？
// block 与函数相似 ，有固定功能的代码块
    //2. block基本语法
    // int a;
    // 1>block声明
    // 2>类型void(^)void 变量名block
    // 声明block  返回值类型 （^block名）（参数列表）
    void (^block)(void);
    //block变量 = ^ (参数列表) {固定代码块}

    block = ^(void) {
        
    };
    // 3.Block几种形式
    // 有参有返
    NSString *(^Block)(NSString *);
    int (^sum)(int ,int) = ^(int a,int b) {
        return  a+ b;
    };
    // 有参无返
    NSString *(^block1)();
    int (^mul)() = ^() {
        return 3;
    };
    // 无参有返
    void (^block2)(int,int) = ^(int a, int b){
        
    };
    // 无参无返
  void (^block3)() = ^ {
      self.view.backgroundColor = [UIColor redColor];
    };
   //系统提供的代码段可以直接使用，inlineBlock
//    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//        <#statements#>
//    };
    // 4.block 调用
    sum(10,20);
    block3();
    // 系统中的block
    //模态 [self presentViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#> completion:<#^(void)completion#>]
    // 2.GCD
//    dispatch_sync(dispatch_get_main_queue(), ^{
//        
//    });
    // 3.系统的网络请求
    //[NSURLSession sharedSession]dataTaskWithRequest:<#(nonnull NSURLRequest *)#> completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>
    // 6.block 写在属性和方法上
    
    // 带block的方法的调用
    [self handeleData:^{
        
    }];
    
    //7. 类型的修饰符
    // --block  __weak  __strong
    
    
    //1>block 在ARC和MRC下有区别
    // 可以在block 内部修改变量
    // ARC下 不能避免循环引用的问题
    // MRC下可以
  __block  int a = 0;
    void(^blockText)() = ^ {
         a = 100;
    };
    blockText();
    // 2>__weak 修饰Block外的变量
    // 只能在ARC下  使用 ，避免Block 的循环引用
    
    //3> __strong强引用
    
    
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)pushNext:(id)sender {
    SecondViewController *vc = [[SecondViewController alloc]init];
    // block 会对其内部的所有对象进行强引用
    // 告诉block 该指针为弱引用
    SecondViewController * __weak weakVC = vc;
  vc.handleString = ^(NSString *title) {
        self.textLabel.text = title;
      weakVC.view.backgroundColor = [UIColor whiteColor];
    };
    [self.navigationController pushViewController:vc animated:YES];
    
}
- (void)dealloc {
    NSLog(@"被释放了");
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
